/*
 * ContextMenu - jQuery plugin for right-click context menus
 *
 * Author: Chris Domigan
 * Contributors: Dan G. Switzer, II
 * Parts of this plugin are inspired by Joern Zaefferer's Tooltip plugin
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Version: r2
 * Date: 16 July 2007
 *
 * For documentation visit http://www.trendskitchens.co.nz/jquery/contextmenu/
 *
 */

(function($) {

	var menu, shadow, trigger, content, hash, currentTarget;
  var defaults = {
	menuStyle: {
	  listStyle: 'none',
	  padding: '1px',
	  margin: '0px',
	  backgroundColor: '#fff',
	  border: '1px solid #999',
	  width: '133px'
	},
	itemStyle: {
	  margin: '0px',
	  color: '#000',
	  display: 'block',
	  cursor: 'default',
	  padding: '3px',
	  border: '1px solid #fff',
	  backgroundColor: 'transparent'
	},
	itemHoverStyle: {
	  border: '1px solid #0a246a',
	  backgroundColor: '#b6bdd2'
	},
	eventPosX: 'pageX',
	eventPosY: 'pageY',
	shadow : true,
	onContextMenu: null,
	onShowMenu: null
	};

  $.fn.contextMenu = function(id, options) {
	if (!menu) {                                      // Create singleton menu
	  menu = $('<div id="jqContextMenu"></div>')
			   .hide()
			   .css({position:'absolute', zIndex:'500'})
			   .appendTo('body')
			   .bind('click', function(e) {
				 e.stopPropagation();
			   });
	}
	if (!shadow) {
	  shadow = $('<div></div>')
				 .css({backgroundColor:'#000',position:'absolute',opacity:0.2,zIndex:499})
				 .appendTo('body')
				 .hide();
	}
	hash = hash || [];
	hash.push({
	  id : id,
	  menuStyle: $.extend({}, defaults.menuStyle, options.menuStyle || {}),
	  itemStyle: $.extend({}, defaults.itemStyle, options.itemStyle || {}),
	  itemHoverStyle: $.extend({}, defaults.itemHoverStyle, options.itemHoverStyle || {}),
	  bindings: options.bindings || {},
	  shadow: options.shadow || options.shadow === false ? options.shadow : defaults.shadow,
	  onContextMenu: options.onContextMenu || defaults.onContextMenu,
	  onShowMenu: options.onShowMenu || defaults.onShowMenu,
	  eventPosX: options.eventPosX || defaults.eventPosX,
	  eventPosY: options.eventPosY || defaults.eventPosY
	});

	var index = hash.length - 1;
	$(this).bind('contextmenu', function(e) {
	  // Check if onContextMenu() defined
	  var bShowContext = (!!hash[index].onContextMenu) ? hash[index].onContextMenu(e) : true;
	  if (bShowContext) display(index, this, e, options);
	  return false;
	});
	return this;
  };

  function display(index, trigger, e, options) {
	var cur = hash[index];
	content = $('#'+cur.id).find('ul:first').clone(true);
	content.css(cur.menuStyle).find('li').css(cur.itemStyle).hover(
	  function() {
		$(this).css(cur.itemHoverStyle);
	  },
	  function(){
		$(this).css(cur.itemStyle);
	  }
	).find('img').css({verticalAlign:'middle',paddingRight:'2px'});

	// Send the content to the menu
	menu.html(content);

	// if there's an onShowMenu, run it now -- must run after content has been added
		// if you try to alter the content variable before the menu.html(), IE6 has issues
		// updating the content
	if (!!cur.onShowMenu) menu = cur.onShowMenu(e, menu);

	$.each(cur.bindings, function(id, func) {
	  $('#'+id, menu).bind('click', function(e) {
		hide();
		func(trigger, currentTarget);
	  });
	});

	menu.css({'left':e[cur.eventPosX],'top':e[cur.eventPosY]}).show();
	if (cur.shadow) shadow.css({width:menu.width(),height:menu.height(),left:e.pageX+2,top:e.pageY+2}).show();
	$(document).one('click', hide);
  }

  function hide() {
	menu.hide();
	shadow.hide();
  }

  // Apply defaults
  $.contextMenu = {
	defaults : function(userDefaults) {
	  $.each(userDefaults, function(i, val) {
		if (typeof val == 'object' && defaults[i]) {
		  $.extend(defaults[i], val);
		}
		else defaults[i] = val;
	  });
	}
  };

})(jQuery);

$(function() {
  $('div.contextMenu').hide();
});